#include <iostream>
using namespace std;

class Person{
    private:
        string name;    // 姓名
        int id;         // 身份证号 --1001 1002
        mutable string tel;     // 手机号
    public:
        Person(){}
        Person(string n, int i, string t):name(n), id(i), tel(t){}
        ~Person(){}
        // 像这种多成员变量应该只读访问的函数 就可以写成 常成员函数
        void show()const{
            cout << "我是常成员函数 show" << endl;
            // 常成员函数中不允许修改成员变量的值
            // name = "北京";
            // id = 0000;
            tel = "13344445555"; // mutable修饰的成员变量允许在成员函数中被修改
            cout << name << " " << id << " " << tel << endl;
        }
        void show(){ // 和上面的show构成重载关系
            cout << "我是普通成员函数 show" << endl;
            cout << name << " " << id << " " << tel << endl;
        }
        // 普通成员函数
        void func(){
            cout << "我是普通成员函数 func" << endl;
        }
};

int main(int argc, const char *argv[]){
    // 普通对象
    Person p1("张三", 1001, "15611112222");
    p1.func(); // 普通对象可以访问普通成员函数
    p1.show(); // 普通对象可以访问常成员函数
    cout << "-------------------" << endl;
    // 常对象
    const Person p2("李四", 1002, "17788889999");
    // p2.func(); // 常对象不可以访问普通成员函数
    p2.show();  // 常对象只能访问常成员函数
    
    cout << "-------------------" << endl;
    const Person &r = p1;
    r.show(); // 访问的是常成员函数

    return 0;
}